﻿//class Solution {
//public:
//    vector<string> topKFrequent(vector<string>& words, int k)
//    {
//        // 仿函数进行比较
//        struct Compare
//        {
//            bool operator()(const pair<string, int>& x1, const pair<string, int>& x2) const
//            {
//                // 要注意优先级队列底层是反的，⼤堆要实现⼩于⽐较，
//                // 所以这⾥次数相等，想要字典序⼩的在前⾯要⽐较字典序⼤的为真
//                return x1.second < x2.second || (x1.second == x2.second && x1.first > x2.first);
//            }
//        };
//
//        // 返回值
//        vector<string> ret;
//        // 创建一个hash表
//        unordered_map<string, int> hash;
//        // 把数据存放在哈希表中
//        for (auto& s : words)
//        {
//            hash[s]++;
//        }
//        // 使用优先级队列存放
//        // 参数分别是: 存放类型，底层实现的容器适配，传入比较的仿函数
//        priority_queue<pair<string, int>, deque<pair<string, int>>, Compare> q(hash.begin(), hash.end(), Compare());
//        for (int i = 0; i < k; ++i)
//        {
//            ret.push_back(q.top().first);
//            q.pop();
//        }
//        return ret;
//    }
//};

#include <iostream>
#include <unordered_map>
#include <utility>
#include <string>
#include <queue>
#include <unordered_map>
#include <vector>
using namespace std;

int main()
{
    // 仿函数比较，建大堆，返回小于的比较（孩子比较父亲）
    struct Compare
    {
        bool operator()(const pair<string, int>& p1, const pair<string, int>& p2)
        {
            return p1.second < p2.second || (p1.second == p2.second && p1.first > p2.first);
        }
    };
    string s;
    getline(cin, s);
    vector<string> word;
    string tmp;
    for (size_t i = 0; i < s.size(); ++i) {
        if (s[i] != ' ' && s[i] != '.')
        {
            tmp += tolower(s[i]);
        }
        else {
            if (tmp.size() >= 1)
                word.push_back(tmp);
            tmp.clear();
        }
    }
    // 创建一个哈希表
    unordered_map<string, int> hash;
    for (auto e : word)
    {
        hash[e]++;
    }
    // 创建优先级队列
    priority_queue<pair<string, int>, vector<pair<string, int>>, Compare> q(hash.begin(), hash.end(), Compare());
    for (size_t i = 0; i < hash.size(); ++i)
    {
        cout << q.top().first << ":" << q.top().second << endl;
        q.pop();
    }
}
// 64 位输出请用 printf("%lld")